Lecture 6 - Practice
Lecture 6 - Practice
1. مفهوم Backtracking
الـ Backtracking يعني إن PROLOG لما يلاقي حاجة غلط بيرجع تاني يجرب حل تاني.
مثال:
likes(ahmed, football).
likes(ahmed, tennis).
likes(sara, tennis).
?- likes(ahmed, X).
X = football ;
X = tennis.
لما لقى أول حل (football) وقف. لو ضغطنا ; بيرجع يجرب تاني (backtracking).
ليه محتاج Cut؟
الـ Cut (!) بيوقف الـ Backtracking عشان نمنع جرب حلول زيادة أو نمنع جرب قواعد تانية.
2. قاعدة f(X, Y) بثلاث طرق
القاعدة الأساسية (من غير Cut)
f(X, 0) :- X < 3.
f(X, 2) :- X =:= 3.
f(X, 4) :- X > 3.
تحليل ?- f(1, Y), 2 < Y:
- Rule 1: X=1, 1<3 true → Y=0
- 2<0? false → backtrack
- Rule 2: X=1, 1=:=3? false → backtrack
- Rule 3: X=1, 1>3? false
- Result: false
تحليل ?- f(5, Y), 2 < Y:
- Rule 1: X=5, 5<3? false
- Rule 2: X=5, 5=:=3? false
- Rule 3: X=5, 5>3? true → Y=4
- 2<4? true
- Result: Y=4
Green Cut (Cut سليم)
f(X, 0) :- X < 3, !.
f(X, 2) :- X =:= 3, !.
f(X, 4) :- X > 3.
تحليل ?- f(1, Y), 2 < Y:
- Rule 1: X=1, 1<3 true → ! → Y=0
- 2<0? false → backtrack للـ Cut
- Cut يمنع جرب القواعد التانية
- Result: false
تحليل ?- f(5, Y), 2 < Y:
- Rule 1: X=5, 5<3? false (قبل الـ Cut)
- Rule 2: X=5, 5=:=3? false (قبل الـ Cut)
- Rule 3: X=5, 5>3? true → Y=4
- 2<4? true
- Result: Y=4 (Green cut مش غيّر السلوك)
Red Cut (Cut خطر)
f(X, 0) :- !, X < 3.
f(X, 2) :- !, X =:= 3.
f(X, 4) :- X > 3.
تحليل ?- f(1, Y), 2 < Y:
- Rule 1: ! يثبت الاختيار, X<3? true → Y=0
- 2<0? false → backtrack للـ Cut
- Cut يمنع جرب أي حاجة تانية
- Result: false
تحليل ?- f(5, Y) (مشكلة!):
- Rule 1: ! يثبت الاختيار, 5<3? false
- Cut يمنع الرجوع للقواعد التانية
- Result: false (مع إنه المفروض يطلع Y=4!)
- الخلاصة: Red Cut غيّر السلوك المنطقي وخلّى الحل الصح يضيع.
3. إيجاد القيمة العظمى (Maximum)
من غير Cut
max(X, Y, X) :- X >= Y.
max(X, Y, Y) :- X < Y.
?- max(5, 3, M).
M = 5 ;
false.
بـ Green Cut
max(X, Y, X) :- X >= Y, !.
max(X, Y, Y).
?- max(5, 3, M).
M = 5.
?- max(3, 3, M).
M = 3.
الـ Cut هنا أمنع جرب القاعدة التانية لو الأولى نجحت.
4. دوال بشرط (Functions with Cut)
y = 3X (X =< 5)
y = X^2 + 5 (X > 5)
func(X, Y) :- X =< 5, !, Y is 3 * X.
func(X, Y) :- X > 5, Y is X * X + 5.
?- func(3, Y).
Y = 9.
?- func(7, Y).
Y = 54.
بدون Cut:
% من غير Cut محتاج الشرط التاني صريح
func2(X, Y) :- X =< 5, Y is 3 * X.
func2(X, Y) :- X > 5, Y is X * X + 5.
5. تصنيف الأرقام (Classify Number)
classify(N) :-
N > 0, !,
write('Positive').
classify(N) :-
N =:= 0, !,
write('Zero').
classify(_) :-
write('Negative').
?- classify(5).
Positive
?- classify(0).
Zero
?- classify(-3).
Negative
6. تقسيم القائمة (Split)
split بتفصل الأرقام الموجبة والسالبة في ليستتين.
split([], [], []).
split([H|T], [H|P], N) :-
H >= 0, !,
split(T, P, N).
split([H|T], P, [H|N]) :-
split(T, P, N).
?- split([1, -2, 3, -4, 5], P, N).
P = [1, 3, 5], N = [-2, -4].
?- split([-1, -2, 0, 3, -4], P, N).
P = [0, 3], N = [-1, -2, -4].
7. تصنيف لاعب التنس (Tennis Player)
winner(rafa).
winner(federer).
fighter(rafa).
fighter(djoko).
fighter(nadal).
sportsman(rafa).
sportsman(federer).
sportsman(djoko).
sportsman(nadal).
tennis(X) :-
winner(X), !,
write('winner').
tennis(X) :-
fighter(X), !,
write('fighter').
tennis(X) :-
sportsman(X), !,
write('sportsman').
?- tennis(rafa).
winner
?- tennis(federer).
winner
?- tennis(djoko).
fighter
?- tennis(nadal).
fighter
?- tennis(sampras).
sportsman % مش فاضل غير sportsman
8. عضو بدون تكرار (Single-Solution Membership - member1)
member1(X, [X|_]) :- !.
member1(X, [_|T]) :-
member1(X, T).
الفرق بين member و member1:
% member بيرجع كل الحلول
?- member(a, [a, b, a, c]).
true ;
true ; % تاني حل
false.
% member1 بيرجع أول حل بس وبعدين يقف
?- member1(a, [a, b, a, c]).
true.
9. إضافة بدون تكرار (Add Without Duplication)
add_no_dup(X, L, L) :-
member1(X, L), !.
add_no_dup(X, L, [X|L]).
?- add_no_dup(3, [1, 2, 3], R).
R = [1, 2, 3].
?- add_no_dup(5, [1, 2, 3], R).
R = [5, 1, 2, 3].
10. توقع الناتج - أسئلة (Q7 Output Predictions)
س 1: إيه ناتج member(a, [b, a, c]).؟
true
(PROLOG يرجع true ويقف مستني)
س 2: إيه ناتج member1(a, [b, a, c]).؟
true
(member1 باستخدام cut بيوقف بعد أول حل)
س 3: إيه الفرق بين outputs بتوع member و member1 في [a, b, a, c]؟
- member:
true ; true ; false - member1:
true
س 4: إيه ناتج add(1, [2, 3], R)؟
R = [1, 2, 3]
س 5: إيه ناتج add_no_dup(1, [2, 3, 1], R)؟
R = [2, 3, 1]
(لأن 1 موجود فعلاً)
س 6: إيه ناتج add_no_dup(4, [1, 2, 3], R)؟
R = [4, 1, 2, 3]
س 7: إيه ناتج ?- max(3, 5, M) من غير Cut؟
M = 5 ;
false.
(لأنه بعد M=5 يرجع يجرب القاعدة التانية عادي)
true(member عادي)true(member1 بيقف بعد أول حل)- member بيدى
true ; true ; false، member1 بيدىtrue R = [1, 2, 3]R = [2, 3, 1](مش مضيفهاش لأنها موجودة)R = [4, 1, 2, 3]M = 5 ; false.